package com.ruoyi.qrCode.service.impl;

import java.util.Date;
import java.util.List;
import java.util.UUID;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.distributionPoster.domain.DistributionPoster;
import com.ruoyi.distributionPoster.domain.QRCodeResult;
import com.ruoyi.distributionPoster.util.QRCodeGenerator;
import com.ruoyi.distributor.domain.DistributionUser;
import com.ruoyi.goods.domain.Goods;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.ruoyi.qrCode.mapper.QrCodeMapper;
import com.ruoyi.qrCode.domain.QrCode;
import com.ruoyi.qrCode.domain.BusinessQRCodeRequest;
import com.ruoyi.qrCode.domain.BusinessQRCodeResult;
import com.ruoyi.qrCode.service.IQrCodeService;
import com.ruoyi.businessSku.domain.BusinessSku;
import com.ruoyi.businessSku.service.IBusinessSkuService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 二维码日志管理Service业务层处理
 * 
 * @author ruoyi
 * @date 2025-08-02
 */
@Service
public class QrCodeServiceImpl implements IQrCodeService 
{
    private static final Logger log = LoggerFactory.getLogger(QrCodeServiceImpl.class);

    @Autowired
    private QrCodeMapper qrCodeMapper;

    @Autowired
    private IBusinessSkuService businessSkuService;

    @Autowired
    private QRCodeGenerator qrCodeGenerator;

    @Value("${qrcode.base-url:https://maomingdongxinzhizun.cn}")
    private String qrCodeBaseUrl;

    @Value("${qrcode.expire-days:30}")
    private Integer qrCodeExpireDays;

    /**
     * 查询二维码日志管理
     * 
     * @param qrCodeId 二维码日志管理主键
     * @return 二维码日志管理
     */
    @Override
    public QrCode selectQrCodeByQrCodeId(Long qrCodeId)
    {
        return qrCodeMapper.selectQrCodeByQrCodeId(qrCodeId);
    }

    /**
     * 查询二维码日志管理列表
     * 
     * @param qrCode 二维码日志管理
     * @return 二维码日志管理
     */
    @Override
    public List<QrCode> selectQrCodeList(QrCode qrCode)
    {
        return qrCodeMapper.selectQrCodeList(qrCode);
    }

    /**
     * 新增二维码日志管理
     * 
     * @param qrCode 二维码日志管理
     * @return 结果
     */
    @Override
    public int insertQrCode(QrCode qrCode)
    {
        qrCode.setCreateTime(DateUtils.getNowDate());
        return qrCodeMapper.insertQrCode(qrCode);
    }

    /**
     * 修改二维码日志管理
     * 
     * @param qrCode 二维码日志管理
     * @return 结果
     */
    @Override
    public int updateQrCode(QrCode qrCode)
    {
        qrCode.setUpdateTime(DateUtils.getNowDate());
        return qrCodeMapper.updateQrCode(qrCode);
    }

    /**
     * 批量删除二维码日志管理
     * 
     * @param qrCodeIds 需要删除的二维码日志管理主键
     * @return 结果
     */
    @Override
    public int deleteQrCodeByQrCodeIds(Long[] qrCodeIds)
    {
        return qrCodeMapper.deleteQrCodeByQrCodeIds(qrCodeIds);
    }
    /**
     * 删除二维码日志管理信息
     *
     * @param qrCodeId 二维码日志管理主签
     * @return 结果
     */
    @Override
    public int deleteQrCodeByQrCodeId(Long qrCodeId)
    {
        return qrCodeMapper.deleteQrCodeByQrCodeId(qrCodeId);
    }

    /**
     * 生成业务商品二维码
     */
    @Override
    public BusinessQRCodeResult generateBusinessQRCode(BusinessQRCodeRequest request) {
        try {
            log.info("开始生成业务商品二维码 - SKU ID: {}, 版本类型: {}, 时间戳: {}",
                    request.getSkuId(), request.getVersionType(), System.currentTimeMillis());

//            // 1. 验证请求参数
//            validateBusinessRequest(request);

            // 2. 验证商品信息
            BusinessSku businessSku = validateBusinessSku(request.getSkuId());

            // 3. 生成场景ID用于唯一性检查
            String sceneId = generateBusinessSceneId(request.getSkuId());

            // 4. 检查是否已存在相同scene_id的记录
//            QrCode existingQrCode = checkExistingBusinessQRCode(sceneId);
//
//            if (existingQrCode != null) {
//                // 如果存在有效记录，直接返回现有结果
//                // 生成二维码内容 通过sceneId生成二维码内容，因为现有记录可能已经过期或无效
//                String qrContent = generateBusinessQRContent(businessSku, request);
//                // 构建QRCodeResult对象并返回（使用数据库中的二维码数据）
//                return buildBusinessQRCodeResult(existingQrCode, qrContent, existingQrCode.getQrCodeData());
//            }

            // 5. 生成二维码内容
            String qrContent = generateBusinessQRContent(businessSku, request);
            log.info("生成业务商品二维码内容: {}", qrContent);

            // 6. 生成二维码图片URL
            String qrCodeData = generateBusinessQRCodeImage(qrContent, request);
            log.info("生成业务商品二维码图片完成 - 数据长度: {}", qrCodeData.length());

            // 7. 查找是否已存在相同scene_id的记录
            QrCode existingQrCode = qrCodeMapper.selectQrCodeBySceneId(sceneId);

            QrCode qrCode;
            if (existingQrCode != null) {
                // 如果存在则更新现有记录
                log.info("更新业务商品二维码记录 - ID: {}", existingQrCode.getQrCodeId());
                qrCode = updateExistingQrCode(existingQrCode, businessSku, request, qrContent, qrCodeData, sceneId);
            } else {
                log.info("创建业务商品二维码记录 - SKU ID: {}, 版本类型: {}", request.getSkuId(), request.getVersionType());
                qrCode = createOrUpdateQrCodeRecord(businessSku, qrContent, qrCodeData, sceneId, request);
            }

            // 7. 创建或更新二维码记录
//            QrCode qrCode = createOrUpdateQrCodeRecord(businessSku, qrContent, qrCodeData, sceneId, request);

            // 8. 返回结果
            // 8. 返回结果
            BusinessQRCodeResult result = buildBusinessQRCodeResult(qrCode, qrContent, qrCodeData);
            log.info("业务商品二维码生成完成 - SKU ID: {}", request.getSkuId());
            return result;
//            return buildBusinessQRCodeResult(qrCode, qrContent, qrCodeData);

        } catch (Exception e) {
            log.error("生成业务商品二维码失败", e);
            throw new ServiceException("业务商品二维码生成失败：" + e.getMessage());
        }
    }

    /**
     * 生成业务商品二维码图片
     */
    @Override
    public BusinessQRCodeResult generateSkuQRCode(BusinessQRCodeRequest qrCodeRequest) {
        try {
            log.info("开始生成业务商品二维码图片 - SKU ID: {}, 宽度: {}, 高度: {}, 时间戳: {}",
                    qrCodeRequest.getSkuId(), qrCodeRequest.getWidth(), qrCodeRequest.getHeight(), System.currentTimeMillis());
            log.info("验证业务商品信息 - SKU ID: {}", qrCodeRequest.getSkuId());
            BusinessSku businessSku = validateBusinessSku(qrCodeRequest.getSkuId());

            log.info("生成场景ID - SKU ID: {}", qrCodeRequest.getSkuId());
            String sceneId = generateBusinessSceneId(qrCodeRequest.getSkuId());

//            // 3. 检查是否已存在相同scene_id的记录
//            QrCode existingQrCode = checkExistingBusinessQRCode(sceneId);
//            if (existingQrCode != null && StringUtils.isNotEmpty(existingQrCode.getQrCodeData())) {
//                // 如果存在有效记录，直接返回现有结果
//                return buildSkuQRCodeResult(existingQrCode, existingQrCode.getQrParams(), existingQrCode.getQrCodeData());
//            }

            log.info("生成二维码内容 - SKU ID: {}", qrCodeRequest.getSkuId());
            String qrContent = generateBusinessQRContent(businessSku, qrCodeRequest);

            log.info("生成二维码图片数据 - SKU ID: {}", qrCodeRequest.getSkuId());
            String qrCodeData = generateSkuQRCodeImage(qrContent, qrCodeRequest);

            log.info("查找是否已存在相同scene_id的记录 - SKU ID: {}", qrCodeRequest.getSkuId());
            QrCode existingQrCode = qrCodeMapper.selectQrCodeBySceneId(sceneId);

            log.info("创建或更新二维码记录 - SKU ID: {}", qrCodeRequest.getSkuId());
            QrCode qrCode;
            if (existingQrCode != null) {
                // 如果存在则更新现有记录
                log.info("更新二维码记录 - ID: {}", existingQrCode.getQrCodeId());
                qrCode = updateExistingQrCode(existingQrCode, businessSku, qrCodeRequest, qrContent, qrCodeData, sceneId);
            } else {
                // 如果不存在则创建新记录
                log.info("创建二维码记录 - SKU ID: {}", qrCodeRequest.getSkuId());
                qrCode = createOrUpdateSkuQrCodeRecord(businessSku, qrCodeRequest, qrContent, qrCodeData, sceneId);
            }

//            // 6. 创建二维码记录（将二维码图片数据保存到数据库）
//            QrCode qrCode = createOrUpdateSkuQrCodeRecord(businessSku, qrCodeRequest, qrContent, qrCodeData, sceneId);

            // 7. 返回结果
            BusinessQRCodeResult result = buildSkuQRCodeResult(qrCode, qrContent, qrCodeData);
            log.info("SKU二维码生成完成 - SKU ID: {}", qrCodeRequest.getSkuId());
            return result;
//            return buildSkuQRCodeResult(qrCode, qrContent, qrCodeData);

        } catch (Exception e) {
            log.error("生成商品二维码失败", e);
            throw new ServiceException("生成二维码失败：" + e.getMessage());
        }
    }

    /**
     * 生成SKU二维码图片数据并返回Base64编码
     */
    private String generateSkuQRCodeImage(String qrContent, BusinessQRCodeRequest qrCodeRequest) {
        // 获取二维码图片尺寸, 默认为300x300
        int width = qrCodeRequest.getWidth() != null ? qrCodeRequest.getWidth() : 300;
        int height = qrCodeRequest.getHeight() != null ? qrCodeRequest.getHeight() : 300;

        // 确保尺寸在合理范围内（100-1000像素）
        width = Math.max(100, Math.min(1000, width));
        height = Math.max(100, Math.min(1000, height));

        try {
            // 生成二维码字节数组
            byte[] qrCodeBytes = qrCodeGenerator.generateQRCodeBytes(qrContent, width, height);

            // 将字节数组转换为Base64编码
            String base64Image = java.util.Base64.getEncoder().encodeToString(qrCodeBytes);

            // 返回Base64格式的图片数据
            return "data:image/png;base64," + base64Image;

        } catch (Exception e) {
            log.error("生成二维码图片失败", e);
            throw new ServiceException("生成二维码图片失败: " + e.getMessage());
        }
    }

        /**
     * 创建或更新SKU二维码记录
     */
    private QrCode createOrUpdateSkuQrCodeRecord(BusinessSku businessSku, BusinessQRCodeRequest qrCodeRequest,
                                                 String qrContent, String qrCodeData, String sceneId) {
        // 创建二维码记录
        QrCode qrCode = new QrCode();

        qrCode.setSkuId(businessSku.getSkuId()); // 关联商品ID
        qrCode.setQrCodeData(qrCodeData); // 二维码图片数据

        qrCode.setSceneId(sceneId); // 二维码参数

        qrCode.setScanCount(1L); // 扫码次数
        qrCode.setQrStatus("0"); // 有效
        qrCode.setStatus("0"); // 上架
        qrCode.setDelFlag("0"); // 存在
        qrCode.setVersion(0L); // 初始版本号

        // 设置创建信息
        qrCode.setCreateBy(SecurityUtils.getUsername());
        qrCode.setCreateTime(new Date());

        // 插入新记录
        int result = qrCodeMapper.insertQrCode(qrCode);
        if (result <= 0) {
            throw new ServiceException("创建二维码记录失败");
        }

        return qrCode;
    }

    /**
     * 更新现有的二维码记录
     */
    private QrCode updateExistingQrCode(QrCode existingQrCode, BusinessSku businessSku,
                                       BusinessQRCodeRequest qrCodeRequest,
                                       String qrContent,
                                       String qrCodeData,
                                       String sceneId) {
        // 更新二维码数据和其他相关信息
        existingQrCode.setQrCodeData(qrCodeData); // 二维码图片数据
        existingQrCode.setUpdateTime(new Date()); // 更新时间
        existingQrCode.setUpdateBy(SecurityUtils.getUsername()); // 更新用户

        // 更新其他字段
        existingQrCode.setSkuId(businessSku.getSkuId()); // 关联商品ID
        existingQrCode.setSceneId(sceneId); // 二维码参数

        existingQrCode.setScanCount(existingQrCode.getScanCount() + 1); // 扫码次数
        existingQrCode.setQrStatus("0"); // 有效
        existingQrCode.setStatus("0"); // 上架

        // 更新数据库记录
        int result = qrCodeMapper.updateQrCode(existingQrCode);
        if (result <= 0) {
            throw new ServiceException("更新二维码记录失败");
        }

        return existingQrCode;
    }


    /**
     * 构建SKU二维码结果
     */
    private BusinessQRCodeResult buildSkuQRCodeResult(QrCode qrCode, String qrContent, String qrCodeData) {
        
        BusinessQRCodeResult result = new BusinessQRCodeResult();
        
        result.setQrCodeId(qrCode.getQrCodeId()); // 二维码ID
        result.setSkuId(qrCode.getSkuId()); // SKU ID作为商品ID

        result.setQrCodeData(qrCodeData); // 返回Base64编码的二维码图片数据
        result.setQrContent(qrContent); // 二维码内容

        // 设置过期时间
        Date expireTime = DateUtils.addDays(new Date(), qrCodeExpireDays);
        result.setExpireTime(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", expireTime)); // 过期时间

        result.setStatus("success"); // 返回成功
        return result;
    }

    /**
     * 验证业务商品二维码请求参数
     */
    private void validateBusinessRequest(BusinessQRCodeRequest request) {
        if (request.getSkuId() == null) {
            throw new ServiceException("商品ID必须提供");
        }
    }

    /**
     * 验证商品信息
     */
    private BusinessSku validateBusinessSku(Long skuId) {
        BusinessSku businessSku = businessSkuService.selectBusinessSkuBySkuId(skuId);
        if (businessSku == null) {
            throw new ServiceException("商品信息不存在");
        }
        // 检查商品状态
        if (!"0".equals(businessSku.getStatus())) {
            throw new ServiceException("商品已下架，无法生成二维码");
        }
        return businessSku;
    }

    /**
     * 生成业务场景ID
     */
    private String generateBusinessSceneId(Long skuId) {
        // 构建业务场景ID，通常包含SKU ID等信息
        return "business_sku_" + skuId;
    }

    /**
     * 检查是否已存在相同scene_id的业务商品二维码记录
     */
    private QrCode checkExistingBusinessQRCode(String sceneId) {
        // 查询是否存在相同参数的二维码记录
//        QrCode existingRecord = qrCodeMapper.selectQrCodeBySceneId(sceneId);
//
//        if (existingRecord != null) {
//            // 检查记录是否有效且未过期
//            if ("0".equals(existingRecord.getQrStatus())) {
//                return existingRecord;
//            }
//            else {
//                // 记录已过期，标记为无效
//                existingRecord.setStatus("2"); // 过期状态
//                existingRecord.setUpdateTime(new Date());
//                qrCodeMapper.updateQrCode(existingRecord);
//                log.info("海报记录已过期，sceneId: {}", sceneId);
//            }
//        }
        return null;
    }

    /**
     * 生成业务商品二维码内容
     */
    private String generateBusinessQRContent(BusinessSku businessSku, BusinessQRCodeRequest request) {
        StringBuilder contentBuilder = new StringBuilder();

        // 业务商品二维码格式：用于商品分享
        // https://maomingdongxinzhizun.cn/miniApp/businessOrder/pages/work/businessOrder/businessOrder?skuId=2

        if ("miniProgram".equals(request.getFormat()) || StringUtils.isEmpty(request.getFormat())) {
            // 小程序商品详情路径
            contentBuilder.append(qrCodeBaseUrl)
                    .append("/miniApp/businessOrder");

            // 根据versionType添加对应的路径
            if ("test".equals(request.getVersionType())) {
                contentBuilder.append("/test");
            } else if ("development".equals(request.getVersionType())) {
                contentBuilder.append("/development");
            }

            contentBuilder.append("/pages/work/businessOrder/businessOrder")
                    .append("?skuId=").append(businessSku.getSkuId())
                    .append("&businessName=").append(businessSku.getBusinessName());

            if (request.getCustomParams() != null) {
                contentBuilder.append("&").append(request.getCustomParams());
            }
        } else {
            // H5商品详情链接
            contentBuilder.append(qrCodeBaseUrl)
                    .append("/business/detail/")
                    .append(businessSku.getSkuId())
                    .append("?businessName=").append(businessSku.getBusinessName());
//                    .append("&type=").append(businessSku.getBusinessType());
        }

        return contentBuilder.toString();
    }

    /**
     * 生成业务商品二维码图片
     */
    private String generateBusinessQRCodeImage(String qrContent, BusinessQRCodeRequest request) {
        Integer width = request.getWidth() != null ? request.getWidth() : 300;
        Integer height = request.getHeight() != null ? request.getHeight() : 300;

        // 确保尺寸在合理范围内（100-1000像素）
        width = Math.max(100, Math.min(1000, width));
        height = Math.max(100, Math.min(1000, height));

        try {
            // 生成二维码字节数组
            byte[] qrCodeBytes = qrCodeGenerator.generateQRCodeBytes(qrContent, width, height);

            // 将字节数组转换为Base64编码
            String base64Image = java.util.Base64.getEncoder().encodeToString(qrCodeBytes);

            // 返回Base64格式的图片数据
            return "data:image/png;base64," + base64Image;

        } catch (Exception e) {
            log.error("生成二维码图片失败", e);
            throw new ServiceException("生成二维码图片失败: " + e.getMessage());
        }
    }


    /**
     * 创建或更新二维码记录
     */
    private QrCode createOrUpdateQrCodeRecord(BusinessSku businessSku, String qrContent,
                                              String qrCodeUrl, String sceneId, BusinessQRCodeRequest request) {
        QrCode qrCode = new QrCode();
        qrCode.setSkuId(businessSku.getSkuId());
        qrCode.setQrCodeUrl(qrCodeUrl);
        qrCode.setQrParams(sceneId);
        qrCode.setScanCount(0L);
        qrCode.setQrStatus("0"); // 有效
        qrCode.setStatus("0"); // 上架
        qrCode.setDelFlag("0"); // 存在
        qrCode.setVersion(0L); // 初始版本号

        // 设置创建信息
        qrCode.setCreateBy(SecurityUtils.getUsername());
        qrCode.setCreateTime(new Date());

        // 插入新记录
        int result = qrCodeMapper.insertQrCode(qrCode);
        if (result <= 0) {
            throw new ServiceException("创建二维码记录失败");
        }

        return qrCode;
    }

    /**
     * 构建业务商品二维码结果
     */
    private BusinessQRCodeResult buildBusinessQRCodeResult(QrCode qrCode, String qrContent, String qrCodeData) {
        // 构建二维码结果
        BusinessQRCodeResult result = new BusinessQRCodeResult();

        result.setQrCodeId(qrCode.getQrCodeId()); // 二维码ID
        result.setSkuId(qrCode.getSkuId()); // 商品ID

        result.setQrCodeData(qrCodeData); // 返回Base64编码的二维码图片数据
        result.setQrContent(qrContent); // 二维码内容


        // 设置过期时间
        Date expireTime = DateUtils.addDays(new Date(), qrCodeExpireDays);
        result.setExpireTime(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", expireTime));

        result.setStatus("success");
        result.setMessage("业务商品二维码生成成功");
        return result;
    }
}
